#include "ContenedorComprimido.h"
#include "Compresor.h"
#include "../Bytes.h"
#include "../FuncionesUtiles.h"
#include "../componentes/RegistroVariable.h"

ContenedorComprimido::ContenedorComprimido(cantBytes tamanio, Compresor* compresor)
	: Bloque(tamanio) {

	this->compresor = compresor;
}

ContenedorComprimido::~ContenedorComprimido() {

}

bool ContenedorComprimido::tieneLugar(RegistroVariable* registro) {

	Bytes serializacion;

	list<Componente*>::iterator it = this->componentes.begin();

	for ( ; it != this->componentes.end(); it++) {
		Bytes registroSerializado = (*it)->serializarse();
		serializacion.agregarAlFinal(registroSerializado);

	}

	serializacion.agregarAlFinal(registro->serializarse());
	serializacion = compresor->comprimir(serializacion);

	if (serializacion.getTamanio() <= this->tamanio) {
		return true;
	} else {
		return false;
	}
}

Bytes ContenedorComprimido::serializarse() {

	Bytes serializacion;
	list<Componente*>::iterator it = this->componentes.begin();

	for ( ; it != this->componentes.end(); it++) {
		Bytes registroSerializado = (*it)->serializarse();
		serializacion.agregarAlFinal(registroSerializado);

	}

	serializacion = compresor->comprimir(serializacion);

	Bytes bytesNulos = crearBytesNulos(this->tamanio-serializacion.getTamanio());
	serializacion.agregarAlFinal(bytesNulos);

	return serializacion;
}

void ContenedorComprimido::hidratarse(const Bytes& bytes) {

	Bytes descomprimidos = compresor->descomprimir(bytes);
	Bloque::hidratarse(descomprimidos);
}
